package com.kaifamiao.io.d0924;

import java.io.File;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.*;
import java.util.stream.Collectors;

public class Deme01 {

    public static void main(String[] args) {
        Class<Student> studentClass = Student.class;
//        getFields(studentClass).stream().forEach(e -> System.out.println(e));

        getClasses(studentClass.getPackageName()).forEach(e -> System.out.println(e));
    }


    public static Collection<Field> getFields(Class cla){
        if (cla != null){
            Set<Field> all = new HashSet<>();
            // 所有 类中显式声明的属性
            Field[] declaredFields = cla.getDeclaredFields();
            // 所有 public 的属性
            Field[] fields = cla.getFields();

            all.addAll(Arrays.stream(declaredFields).collect(Collectors.toSet()));
            all.addAll(Arrays.stream(fields).collect(Collectors.toSet()));

            // 获取父类
            Class superclass = cla.getSuperclass();

            Field[] superclassDeclaredFields = superclass.getDeclaredFields();
            boolean isSamePackage = cla.getPackage() == superclass.getPackage();

            Set<Field> superField = Arrays.stream(superclassDeclaredFields).filter(field -> {
                int mod = field.getModifiers();
                if (isSamePackage){
                    return !Modifier.isPrivate(mod);
                } else{
                    return (Modifier.isPublic(mod) || Modifier.isProtected(mod));
                }
            }).collect(Collectors.toSet());

            all.addAll(superField);

//            for (Field extendField : superclassDeclaredFields){
//                /*
//                   是同一个包， 只要不是 private
//                   不是同一个包， public protected
//                 */
//                int mod = extendField.getModifiers();
//                if (isSamePackage){
//                    if (!Modifier.isPrivate(mod)){
//                        all.add(extendField);
//                    }
//                } else{
//                    if (Modifier.isPublic(mod) || Modifier.isProtected(mod)){
//                        all.add(extendField);
//                    }
//                }
////                if (isSamePackage && !Modifier.isPrivate(mod)){
////                    all.add(extendField);
////                } else if (!isSamePackage && (Modifier.isPublic(mod) || Modifier.isProtected(mod))){
////                    all.add(extendField);
////                }
//            }
//            System.out.println(Arrays.toString(fields));
            return all;
        }
        return null;
    }


    /**
     * 获取 包下所有的类
     * @param packageName 包路径  eg: com.kaifamiao.demo
     * @return
     *
     * mark: 以当前开发工具环境为例，生产环境需要改变代码
     */
    public static Collection<Class> getClasses(String packageName){
        if (null != packageName){
            String filePath = packageName.replace(".", File.separator);
//            System.out.println(filePath);

            File directory = new File("src" + File.separator + filePath);

            if (!directory.isDirectory()){
                throw new IllegalArgumentException(packageName + " 不是一个包路径");
            }

            // 使用 FilenameFilter 获取所有 .java 文件
            String[] names = directory.list((dir, name) -> name.endsWith(".java"));

            List<Class> list = new LinkedList<>();
            for (String name : names){
                try {
                    Class cla = Class.forName(packageName + "." + name.replace(".java", ""));
                    list.add(cla);
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
            return list;
        }
        return null;
    }
}
